﻿#region Licence
/*
 * Copyright (c) 2008, 2009, SmartGrid.NET Ltd
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, 
 * this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice, 
 * this list of conditions and the following disclaimer in the documentation 
 * and/or other materials provided with the distribution.
 *
 * Neither the name of SmartGrid.NET Ltd nor the names of its contributors 
 * may be used to endorse or promote products derived from this software 
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 * 
 */
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;


using log4net;

namespace ServiceBroker.Service
{
    static class Program
    {
        #region Logging
        static readonly ILog _log = LogManager.GetLogger(typeof(Program));
        #endregion

        #region Constants
        const string RUN_AS_CONSOLE = "-RunAsConsole";
        #endregion

        #region Main

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            try
            {
                // Configure log4net
                log4net.Config.XmlConfigurator.Configure();

                // Install Unhandled Exception Handler
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException);

                // Process CmdLine
                bool runAsService = true;
                if (0 < args.Length)
                {
                    if (args[0] == RUN_AS_CONSOLE)
                        runAsService = false;
                }

                #region Run

                if (runAsService)
                {
                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[] 
			        { 
				        new Host(), 
			        };
                    ServiceBase.Run(ServicesToRun);
                }
                else
                {
                    Host host = new Host();
                    host.Start(null);

                    Console.WriteLine("Press the any key to stop this server");
                    Console.ReadLine();

                    host.Stop();
                }

                #endregion
            }
            catch (Exception e)
            {
                _log.Error("Unexpected Exception", e);
            }
        }

        static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            _log.Error("Unhandled Exception", (Exception)e.ExceptionObject);
        }

        #endregion
    }
}
